cpuidle: remove hpet access in hpet_broadcast_exit
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 17 Jun 2010 07:52:29 +0000 (08:52 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 17 Jun 2010 07:52:29 +0000 (08:52 +0100)
hpet_broadcast_exit calls reprogram_hpet to stop possible hpet intr if
the last deep-cstate waken up cpu is waken by unexpected intrs instead
of hpet broadcast handler. This can be removed without brings much
useless intrs, but bring chance for further optimization. It is a
tradeoff between grace & optimization.

BTW, move the cpumask set out of critial section in
hpet_broadcast_enter to shorten it.

Signed-off-by: Wei Gang <gang.wei@intel.com>
xen/arch/x86/hpet.c

index 47cc82ea210c8f2f4f694c9f5119a92597cf7eb4..4bfc11d9c4a7edb3718e3e2a1bdb02f2e70463a1 100644 (file)
@@ -664,14 +664,12 @@ void hpet_broadcast_enter(void)
 
     /* Disable LAPIC timer interrupts. */
     disable_APIC_timer();
+    cpu_set(cpu, ch->cpumask);
 
     spin_lock(&ch->lock);
-
-    cpu_set(cpu, ch->cpumask);
     /* reprogram if current cpu expire time is nearer */
     if ( this_cpu(timer_deadline_end) < ch->next_event )
         reprogram_hpet_evt_channel(ch, this_cpu(timer_deadline_end), NOW(), 1);
-
     spin_unlock(&ch->lock);
 }
 
@@ -692,11 +690,7 @@ void hpet_broadcast_exit(void)
         raise_softirq(TIMER_SOFTIRQ);
 
     spin_lock_irq(&ch->lock);
-
     cpu_clear(cpu, ch->cpumask);
-    if ( cpus_empty(ch->cpumask) && ch->next_event != STIME_MAX )
-        reprogram_hpet_evt_channel(ch, STIME_MAX, 0, 0);
-
     spin_unlock_irq(&ch->lock);
 
     if ( ch != &legacy_hpet_event )